package com.shopowner.controller;

import cn.hutool.core.text.StrSpliter;
import com.shopowner.dto.DTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Optional;
import java.util.Random;

/**
 * @Description
 * @Author sgl
 * @Date 2018-05-15 14:04
 */
@CrossOrigin
@Controller
public class UploadController {
    private static final Logger LOGGER = LoggerFactory.getLogger(UploadController.class);

    @GetMapping("/upload")
    public String upload() {
        return "upload";
    }

    @PostMapping("/uploadImg")  //等价下面这条注解
    //@RequestMapping(name="/uploadImg",method = RequestMethod.POST)
    @ResponseBody
    public DTO<String> upload(@RequestParam("file") MultipartFile[] files, HttpServletRequest request, HttpServletResponse response) {//要求前端提交多表单 mutipartForm
        DTO dto = new DTO(403, "");
        boolean flag = true;
        String imageNames = "";
        if (files.length==0) {
            dto.setMsg("上传失败，请选择文件");
        } else {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");// 设置日期格式
            String newFileName = "";
            for(MultipartFile file:files) {
                  newFileName = df.format(new Date());
                newFileName += Math.abs(new Random().nextInt() % 1000);
                try {
                    String fileName = file.getOriginalFilename();
                    String model = Optional.ofNullable(request.getParameter("model")).orElse("temp");//不同的图片 存放不同的目录
                    String ext = StrSpliter.split(fileName, ".", 0, true, true).get(1);//例如2.jpg 按.分割 成为一个数组 数组的第2部分就是后缀名
                    newFileName += "." + ext;
                    // System.out.println("/upload/"+newFileName);
                    String parentfile = "c:/upload/";//真正的路径  getRequestURL 得到相对路径 getRealPath 得到完整的绝对路径 类似c://11/路径
                    System.out.println(parentfile);
                    parentfile = parentfile + "\\" + model;//项目上传文件夹的真正绝对路径 加上 模块名 组成存放文件的路径
                    System.out.println(parentfile);
                    File newfile = new File(parentfile);
                    if (!newfile.exists()) {//model文件夹是否存在不存在 创建
                        newfile.mkdirs();
                    }

                    File backupFile = new File("D:\\upload\\" + model);//本来文件上传是上传到tomcat的upload目录，因为你的数据是提交给tomcat（8080），我们额外备份到d盘
                    if (!backupFile.exists()) {
                        backupFile.mkdirs();
                    }
                    String fullNewFile = "c:/upload/" + model + "/" + newFileName;
                    String fullBackFile = "D:/upload/" + model + "/" + newFileName;
                    //*********************************存放文件到磁盘********************************
                    file.transferTo(new File(fullNewFile));//因为生成文件是从缓存中 存放过来的所以用了一次就没有数据了 要生成备份文件需要重新拷


                    FileInputStream fis = new FileInputStream(fullNewFile);
                    FileOutputStream fos = new FileOutputStream(fullBackFile);
                    BufferedInputStream bis = new BufferedInputStream(fis);
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    long begintime = System.currentTimeMillis();//当前系统的毫秒
                    byte[] bytes = new byte[80 * 1024 * 1024];//10 和 8192
                    //缓冲流 数据默认必须输出的大小是8192 如果我们自己设定的 数据输出的标准低于了这个值，则最后一部分数据 （一车）由于没有达到
                    //必须输出（必须发车）的标准 则不flush 就不输出 就丢失了
                    int len = 0;
                    //只要还能从输入流中读取到数据，数据的流式处理，挨着
                    while ((len = bis.read(bytes)) != -1) {//将每次读取的长度 超过0说明后面还有内容
                        bos.write(bytes, 0, len);
                    }
                    imageNames += newFileName + "";
                    System.out.println(imageNames);
                    bos.flush();
                    bis.close();
                    bos.close();


                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    flag= false;
                    e.printStackTrace();

                }
            }
            if(files.length < 1 ) {
                if (newFileName != null) {
                    System.out.println(newFileName);
                    dto.setMsg("上传成功");
                    dto.setObj(newFileName);
                    dto.setCode(200);
                }
            }else{
                if(flag){
                    System.out.println(imageNames);
                    dto.setMsg("上传成功");
                    dto.setObj(imageNames);
                    dto.setCode(200);
                }
            }
        }
        return dto;
    }


}